package com.lt.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lt.domain.User;
import com.lt.domain.VO;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;


/**
 * controller包 也是web层包
 * 代表SpringMVC中的C
 * C:controller 控制器 主要用于分发指派的工作
 */

/**
 * 首先在web.xml文件配置好springMVC的前端控制器
 * 创建好save方法后开始配置
 * 通过@Controller注解把controller放进spring容器当中
 * 然后你请求时 请求的地址要跟这个save方法之间得有映射关系
 * @RequestMapping Request请求 Mapping映射
 * 名字就叫 /saveC
 * 在访问 /saveC时spring会帮你映射到这个save方法，然后执行打印的语句，
 * 最终返回success.jsp 跳到视图当中
 *
 * 写完后spring并没有进行对应的扫描 要在spring文件中配置扫描
 * 所以要告诉spring容器 来这个包下扫描
 *所以去spring-mvc.xml文件下配置包扫描
 * 配置完扫描后告诉spring容器加载spring-mvc.xml配置文件
 * 所以去web.xml文件中去初始化参数
 */
@Controller
public class UserController {
//当来到该类后会扫描映射 检测你在浏览器上输入的/saveC是否在下面

    /**
     * RequestMapping的属性
     * value 和path属性一样 在这写不写都一样
     * method 指定请求方式 get post
     * params 用于指定请求的参数条件
     * params={id}表示请求参数必须有id 写上之后必须传才可以访问
     * params={age!500}表示请求参数age不能是500
     */
    @RequestMapping(value = "/saveC",method = RequestMethod.GET,params = {"username"})//找到后执行下面代码
    public String save(){
        System.out.println("UserController.save");
        return "success";//return代表 是你要跳转的视图
//        redirect:/success.jsp 重定向跳转（地址栏会变）  forward:/success.jsp 转发
    }

    /**
     * 上面是返回字符串的形式 进行页面跳转
     * 页面跳转通过ModelAndView 返回 页面跳转通过ModelAndView
     *model:模型 作用：封装数据
     *view:视图  作用：展示数据
     */
    @RequestMapping("/mv")//找到后执行下面代码
    public ModelAndView mv(){
        //因为是自己new ModelAndView();所以在这里它的值为空
        ModelAndView modelAndView = new ModelAndView();
        //设置模型数据
        modelAndView.addObject("username","Tom");//相当于放到request域当中了
        //设置视图名称
        modelAndView.setViewName("test");
        return modelAndView;
    }
    @RequestMapping("/mv2")//找到后执行下面代码
    public ModelAndView mv2(ModelAndView modelAndView){
        //设置模型数据
        modelAndView.addObject("username","Jerry");//相当于放到request域当中了
        //设置视图名称
        modelAndView.setViewName("test");
        return modelAndView;
    }

    @RequestMapping("/mv3")//找到后执行下面代码
    public String mv3(Model model){
       model.addAttribute("username","Spike");
       return "test";
    }

    @RequestMapping("/mv4")//找到后执行下面代码
    public String mv4(HttpServletRequest request){
        //通过浏览器request向test.jsp页面打印数据
        request.setAttribute("username","孙悟空");
        return "test";
    }





    @RequestMapping("/mv5")//找到后执行下面代码
    public void mv5(HttpServletResponse response) throws IOException {
        response.getWriter().println("it cart");//自己手动向浏览器页面打印it cart
    }
    @RequestMapping("/mv6")//找到后执行下面代码
    @ResponseBody//告知springmvc框架 不进行视图跳转 而是直接打印return语句
    public String mv6()  {
        return "hello student";
        //通过@ResponseBody注解告知springmvc框架
        //向浏览器页面打印hello student
    }

    @RequestMapping("/mv7")//找到后执行下面代码
    @ResponseBody//告知springmvc框架 不进行视图跳转 而是直接打印return语句
    public String mv7() throws JsonProcessingException {
        User user = new User();
        user.setName("lisiW");
        user.setAge(30);
        //使用json转换工具 手动转换 将对象转换json格式再return
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(user);
        return json;
        //return "{\"username\":\"Tom\",\"age\":5}"; //手动输json格式
    }

    @RequestMapping("/mv8")//找到后执行下面代码
    @ResponseBody//告知springmvc框架 不进行视图跳转 而是直接打印return语句
    public User mv8()  {
        //springmvc框架自动将User对象转换为json格式
        User user = new User();
        user.setName("李四");
        user.setAge(30);
        return user;
    }


    @RequestMapping("/mv9")
    @ResponseBody
    public void mv9(String username,int age)  {
        //获取基本类型参数 mvc实现数据请求的方式
        //当你访问页面时 必须要传过来username和age这两个规定好的参数才可以访问
        System.out.println(username);
        System.out.println(age);
    }

    @RequestMapping("/mv10")
    @ResponseBody
    public void mv10(User user)  {
        //获取pojo类型参数 mvc实现数据请求的方式
        System.out.println(user);
    }

    @RequestMapping("/mv11")
    @ResponseBody
    public void mv11(String[] arr)  {
        //获取数组类型参数 mvc实现数据请求的方式
//        System.out.println(Arrays.asList(arr));数组转集合
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);//打印数组内容
        }
    }


    @RequestMapping("/mv12")
    @ResponseBody
    public void mv12(VO vo)  {
        //获取集合参数类型 需访问form.jsp去提交表单才有数据 mvc实现数据请求的方式
        System.out.println(vo);
    }

    @RequestMapping("/mv13")
    @ResponseBody
    public void mv13(@RequestBody List<User> userList)  {
        //获取集合参数类型
        /**
         * @RequestBody请求体
         * 这个要访问ajax.jsp
         * 当使用ajax提交时 可以指定json格式
         */
        System.out.println(userList);
    }

    @RequestMapping("/mv14")
    @ResponseBody
    /**
     * 参数绑定注解@RequestParam
     *  value等于是username被n替代了
     *  required= false表示不是必须传入的
     *  defaultValue 表示没有传入时会用默认的值
     */
    public void mv14(@RequestParam(value = "n",required = false,defaultValue = "默认名称") String username, int age)  {
        //获取基本类型参数
        //当你访问页面时 必须要传过来username和age这两个规定好的参数才可以访问
        System.out.println(username);
        System.out.println(age);
    }

    @RequestMapping(value = "/mv15/{id}",method = RequestMethod.GET)
    @ResponseBody
    public void mv15(@PathVariable("id") int id)  {
        //使用restful风格传入id
        System.out.println(id);
    }

    @RequestMapping("/mv16")
    @ResponseBody
    public void mv16(Date date)  {
//自定义日期格式 按照自己的格式
        System.out.println(date);
//http://localhost:8080/mv16?date=2019/6/15%2010:25:10 输入时间和日期
    }

    /**
     * 获取servlet相关api
     *  HttpServletRequest  请求
     *  HttpServletResponse 响应
     *  HttpSession
     */
    @RequestMapping("/mv17")
    @ResponseBody
    public void mv17(HttpServletRequest request, HttpServletResponse response, HttpSession session)  {
        System.out.println("request = " + request + ", response = " + response + ", session = " + session);
    }

    @RequestMapping("/mv18")
    @ResponseBody
    public void mv18(@RequestHeader(value = "User-Agent",required = false) String httpHand,@CookieValue(value = "JSESSIONID") String cookie)  {
        //获取请求头
        System.out.println(httpHand);
        //获取cookie
        System.out.println(cookie);
   }

    @RequestMapping("/mv19")
    @ResponseBody
    public void mv19(String username, MultipartFile upload) throws IOException {
        //单文件上传
        System.out.println(username);
        System.out.println(upload);
        String filename = upload.getOriginalFilename();//获取文件名称
        //将文件放在该目录下
        upload.transferTo(new File("D:\\work\\"+filename));
    }


}
